home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / amiga / sipp.lha / sipp / demo / teapot.c < prev    next >
C/C++ Source or Header  |  1993-03-13  |  5KB  |  218 lines

  1. #include <stdio.h>
  2.  
  3. #include <sipp.h>
  4. #include <primitives.h>
  5. #include <geometric.h>
  6. #include <noise.h>
  7. #include <shaders.h>
  8.  
  9.  
  10. #define RESOLUTION 9
  11.  
  12. Surf_desc teapot_surf = {
  13.     0.4, 
  14.     0.5,
  15.     0.1, 
  16.     {0.9, 0.6, 0.6}, 
  17.     {0.45, 0.45, 0.45},
  18. };
  19.  
  20. typedef struct {
  21.     double   sqsize;
  22.     Surf_desc   col1;
  23.     Surf_desc   col2;
  24. } Floor_desc;
  25.  
  26.  
  27. Floor_desc floor_surf = {
  28.     1.0, 
  29.     { 0.4, 0.0, 0.1, {0.9900, 0.9000, 0.7900}, {1.0, 1.0, 1.0} },
  30.     { 0.4, 0.0, 0.1, {0.8300, 0.2400, 0.1000}, {1.0, 1.0, 1.0} }
  31. };
  32.  
  33.  
  34. extern bool noise_ready;
  35.  
  36.  
  37. void
  38. hole_shader(pos, normal, texture, view_vec, lights, sd, color, transp)
  39.     Vector      *pos;
  40.     Vector      *normal;
  41.     Vector      *texture;
  42.     Vector      *view_vec;
  43.     Lightsource *lights;
  44.     Surf_desc   *sd;
  45.     Color       *color;
  46.     Color       *transp;
  47. {
  48.     Vector     tmp;
  49.  
  50.     if (!noise_ready) {
  51.         noise_init();
  52.     }
  53.  
  54.     VecCopy(tmp, *texture);
  55.     VecScalMul(tmp, 35.0, tmp);
  56.     
  57.     if (noise(&tmp) < -0.1) {
  58.         sd->opacity.red = 0.0;
  59.         sd->opacity.grn = 0.0;
  60.         sd->opacity.blu = 0.0;
  61.     } else {
  62.         sd->opacity.red = 1.0;
  63.         sd->opacity.grn = 1.0;
  64.         sd->opacity.blu = 1.0;
  65.     }
  66.  
  67.     basic_shader(pos, normal, texture, view_vec, lights, sd, color, transp);
  68. }
  69.  
  70.  
  71. /*
  72.  * A shader to produce a checkered floor.
  73.  */
  74. static void
  75. floor_shader(pos, normal, texture, view_vec, lights, fd, color, transp)
  76.     Vector      *pos;
  77.     Vector      *normal;
  78.     Vector      *texture;
  79.     Vector      *view_vec;
  80.     Lightsource *lights;
  81.     Floor_desc  *fd;
  82.     Color       *color;
  83.     Color       *transp;
  84. {
  85.     Surf_desc  * col;
  86.     int          intu;
  87.     int          intv;
  88.  
  89.     intu = floor(texture->x / fd->sqsize);
  90.     if (intu < 0) 
  91.     intu = -intu;
  92.  
  93.     intv = floor(texture->y / fd->sqsize);
  94.     if (intv < 0) 
  95.     intv = -intv;
  96.  
  97.     if ((intu ^ intv) & 1)
  98.     col = &fd->col1;
  99.     else
  100.         col = &fd->col2;
  101.  
  102.     basic_shader(pos, normal, texture, view_vec, lights, col, color, transp);
  103. }
  104.  
  105.  
  106.  
  107. extern char *optarg;
  108.  
  109. main(argc, argv)
  110.     int argc;
  111.     char **argv;
  112. {
  113.     Object  *teapot;
  114.     Object  *handle;
  115.     Object  *spout;
  116.     Object  *body;
  117.     Object  *lid;
  118.     Object  *bottom;
  119.     FILE    *infile;
  120.     FILE    *image;
  121.  
  122.     Object  *floor;
  123.  
  124.     char    *imfile_name;
  125.     int      mode;
  126.     int      c;
  127.     int      size;
  128.  
  129.     imfile_name = "teapot.ppm";
  130.     mode = PHONG;
  131.     size = 256;
  132.  
  133.     while ((c = getopt(argc, argv, "pgfls:")) != EOF) {
  134.         switch (c) {
  135.           case 'p':
  136.             mode = PHONG;
  137.             imfile_name = "teapot.ppm";
  138.             break;
  139.  
  140.           case 'g':
  141.             mode = GOURAUD;
  142.             imfile_name = "teapot.ppm";
  143.             break;
  144.  
  145.           case 'f':
  146.             mode = FLAT;
  147.             imfile_name = "teapot.ppm";
  148.             break;
  149.  
  150.           case 'l':
  151.             mode = LINE;
  152.             imfile_name = "teapot.pbm";
  153.             break;
  154.  
  155.           case 's':
  156.             size = atoi(optarg);
  157.             break;
  158.         }
  159.     }
  160.  
  161.     sipp_init();
  162.     sipp_show_backfaces(TRUE);
  163.     sipp_shadows(TRUE, ((size<512)?2*size:size));
  164.     sipp_background(0.078, 0.361, 0.753); /* UNC sky blue */
  165.  
  166.     infile = fopen("tpt_handle.bez", "r");
  167.     handle = sipp_bezier_file(infile, RESOLUTION, &teapot_surf, hole_shader);
  168.     fclose(infile);
  169.  
  170.     infile = fopen("tpt_spout.bez", "r");
  171.     spout = sipp_bezier_file(infile, RESOLUTION, &teapot_surf, hole_shader);
  172.     fclose(infile);
  173.  
  174.     infile = fopen("tpt_body.bez", "r");
  175.     body = sipp_bezier_file(infile, RESOLUTION, &teapot_surf, hole_shader);
  176.     fclose(infile);
  177.  
  178.     infile = fopen("tpt_lid.bez", "r");
  179.     lid = sipp_bezier_file(infile, RESOLUTION, &teapot_surf, hole_shader);
  180.     fclose(infile);
  181.  
  182.     bottom = sipp_cylinder(0.375, 0.01, RESOLUTION * 4, &teapot_surf,
  183.                            hole_shader);
  184.     object_move(bottom, 0.0, 0.0, 0.005);
  185.  
  186.     teapot = object_create();
  187.     object_add_subobj(teapot, body);
  188.     object_add_subobj(teapot, lid);
  189.     object_add_subobj(teapot, handle);
  190.     object_add_subobj(teapot, spout);
  191.     object_add_subobj(teapot, bottom);
  192.  
  193.     object_add_subobj(sipp_world, teapot);
  194.  
  195.     floor = sipp_block(7.0, 7.0, 0.2, &floor_surf, floor_shader);
  196.     object_move(floor, 0.0, 0.0, -0.1);
  197.     object_add_subobj(sipp_world, floor);
  198.  
  199.     lightsource_create(-3.0, -2.0, 6.0, 0.35, 0.35, 0.35, LIGHT_DIRECTION);
  200.     spotlight_create(-3.0, -2.0, 6.0,  
  201.                      0.0, 0.0, 0.0, 
  202.                      25.0, 
  203.                      0.45, 0.45, 0.45, 
  204.                      SPOT_SOFT, TRUE);
  205.  
  206.     camera_params(sipp_camera, 1.65, -7.7, 3.3,  0.0, 0.0, 0.4,  
  207.                   0.0, 0.0, 1.0,  0.125);
  208.  
  209.     printf("Rendering, wait...");
  210.     fflush(stdout);
  211.  
  212.     image = fopen(imfile_name, "w");
  213.     render_image_file(size, size, image, mode, 3);
  214.     printf("Done.\n");
  215.  
  216.     exit(0);
  217. }
  218.